/* 

给你一个链表数组，每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中，返回合并后的链表。

 

示例 1：

输入：lists = [[1,4,5],[1,3,4],[2,6]]
输出：[1,1,2,3,4,4,5,6]
解释：链表数组如下：
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2：

输入：lists = []
输出：[]
示例 3：

输入：lists = [[]]
输出：[]
 

提示：

k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

*/


/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */

var mergeKLists = function (lists) {
    if (lists.length === 0) return null;
    if (lists.length === 1) return lists[0];

    var mergeTwoLists = function (l1, l2) {
        const merge = (l1, l2) => {
            if (l1 === null) return l2;
            if (l2 === null) return l1;
            
            if (l1.val > l2.val) {
                l2.next = merge(l1, l2.next);
                return l2;
            } else {
                l1.next = merge(l1.next, l2);
                return l1;
            }
        }
        return merge(l1, l2);
    };

    var mergeLists = function (lists, start, end) {
        if (end - start < 0) return null;
        if (end - start === 0) return lists[end];

        const mid = Math.floor((end + start) / 2);

        return mergeTwoLists(mergeLists(lists, start, mid), mergeLists(lists, mid + 1, end));
    }

    return mergeLists(lists, 0, lists.length - 1)
};